package Day004.demo001_Object类;

/*
    Object类:
            Object类是java语言中的根类(顶层父类)

            1.所有类都是直接或者间接继承Object类
            2.Object类有1个空参构造,11个常用方法
            3.java.lang包

   1. toString()方法
        (1).Object类的toString()方法默认返回的字符串形式为: 对象的类型 + @ + 十六进制数的地址值
        (2).打印对象,打印的就是该对象调用toString方法返回的字符串内容
        (3).开发中,如果希望打印对象的时候不是打印对象的地址值,那么需要重写toString方法
            Alt + Ins --> toString()

   2. equals()方法
        (1).比较两个对象是否"相等",默认比较两个对象的地址值
        (2).参数是Object类,就可以接收一切类的对象(多态)
        (3).开发中,如果比较的不是对象的地址值,那么需要重写equals方法
            Alt + Ins --> equals and hashCode

   3.了解Objects类:
                Objects类是Object类的工具类,该类定义了很多静态方法,可以直接使用类名访问,并且该类中的方法是空指针安全的
                Objects类的equals()方法源码:
                                        public static boolean equals(Object a, Object b) {
                                            如果传入的a,b对象地址相同,就直接返回true
                                            如果传入的a,b对象地址不同:
                                                如果传入的第一个对象a为null,name返回false
                                                如果传入的第一个对象a不为null,才去比较
                                            return (a == b) || (a != null && a.equals(b));
                                        }

    4.了解native修饰的方法:
                        概述:本地方法,没有方法体
                            public static native void registerNatives();
                                //静态代码块
                                static {
                                }
                        作用:调用非java方法时,方法的实现由非java实现(C C++)
 */

public class Test {
    public static void main(String[] args) {

        //1. toString()方法
        //创建Person类对象,调用toString方法

        /*  Person p =new Person("周某人" ,12);
            String s = p.toString();
            System.out.println(s); //Day004.demo001_Object类.Person@1540e19d
            Object类的toString()方法默认返回的字符串形式为: 对象的类型 + @ + 十六进制数的地址值

            System.out.println(p); //Day004.demo001_Object类.Person@1540e19d
            打印对象,打印的就是该对象调用toString方法返回的字符串内容
        */

        //  Person类重写toString()方法后
        Person p =new Person("周某人","男",12);
        String s = p.toString();
        System.out.println(s); //Person{name='周某人', sex='男', age=12}
        System.out.println(p); //Person{name='周某人', sex='男', age=12}

        System.out.println("--------------------------------");

        //2. equals()方法
        //创建Person类对象,调用equals方法

        /*  Person p1 = new Person("李某人",20);
            Person p2 = new Person("李某人",20);
            boolean b = p1.equals(p2);
            System.out.println(b); // false

            System.out.println(p1 == p2); // false
            比较两个对象是否"相等",默认比较两个对象的地址值
        */

        //  Person类重写equals()方法后
        Person p1 = new Person("李某人","男",20);
        Person p2 = new Person("李某人","男",20);
        boolean b = p1.equals(p2);
        System.out.println(b); // true
        System.out.println(p1 == p2); // false

    }
}
